﻿Imports FairShop.Objects
Imports FairShop.Operaties

Public Class LeveringsbonDetailsForm

    ' TODO: nieuw detail toevoegen
    ' TODO: meeste wijzigingen enablen save-knop niet

    Private _mainForm As Form
    Private _myLeveringsbonRow As FairShop.ArtikelsDataSet.VerkopenRow
    Private _kanBewaren As Boolean = False
    Private _kanWijzigen As Boolean = False
    Private _kanVerwijderen As Boolean = False

#Region "Public property's"

    Public Property KanBewaren() As Boolean
        Get
            Return _kanBewaren
        End Get
        Set(ByVal value As Boolean)
            _kanBewaren = value
            tsbBewaren.Enabled = value
        End Set
    End Property

    Public Property KanWijzigen() As Boolean
        Get
            Return _kanWijzigen
        End Get
        Set(ByVal value As Boolean)
            _kanWijzigen = value
            tsbWijzigen.Enabled = value
        End Set
    End Property

    Public Property KanVerwijderen() As Boolean
        Get
            Return _kanVerwijderen
        End Get
        Set(ByVal value As Boolean)
            _kanVerwijderen = value
            tsbVerwijderen.Enabled = value
        End Set
    End Property

    ''' <summary>
    ''' Geeft de originele waarde terug van IsFactuurBehandeld op de leveringsbon,
    ''' deze bepaalt of je nog kan wijzigen of niet.
    ''' </summary>
    Private ReadOnly Property IsFactuurBehandeld() As Boolean
        Get
            Return Convert.ToBoolean(_myLeveringsbonRow.Item("IsFactuurBehandeld", DataRowVersion.Original))
        End Get
    End Property

#End Region

#Region "Constructor"

    Public Sub New(ByVal mainForm As Form, ByVal verkoopRow As ArtikelsDataSet.VerkopenRow)
        Me._mainForm = mainForm
        Me._myLeveringsbonRow = verkoopRow
        InitForm()
    End Sub

    Private Sub InitForm()
        Try
            InitializeComponent()

            'Alle bindingsources initializeren
            Me.KlantenBindingSource.DataSource = Utility.Data
            Me.WinkeliersBindingSource.DataSource = Utility.Data
            Me.VerkoopsoortenBindingSource.DataSource = Utility.Data
            Me.VerkopenBindingSource.DataSource = Utility.Data
            Me.VerkopenBindingSource.Position = Utility.Data.Verkopen.Rows.IndexOf(_myLeveringsbonRow)
            Me.VerkoopsDetailsBindingSource.DataSource = Utility.Data
            Me.VerkoopsDetailsBindingSource.Filter = String.Format("idVerkoop={0}", _myLeveringsbonRow.Id)

            For Each row As ArtikelsDataSet.VerkoopsDetailsRow In _myLeveringsbonRow.GetVerkoopsDetailsRows()
                ' omschrijving nog invullen vanuit Artikels-tabel
                row.Omschrijving = row.VolledigeOmschrijving
                ' berekende kolommen nog invullen
                row.HerberekenTotaal()
                row.Status = StatusImage.Afgerekend
                row.AcceptChanges()
            Next

            UpdateTotaal()

            lblWinkelier.Text = Utility.Data.Winkeliers.FindById(_myLeveringsbonRow.IdWinkelier).Naam

            Me.DialogResult = DialogResult.Cancel

            tbFactuurNummer.Enabled = Not cbBehandeld.Checked
        Catch ex As Exception
            MsgBox.ShowError(ex.ToString + "Fout tijdens initialiseren Factuurdetails")
            log.WriteError("LeveringsbonDetailsForm.InitForm", ex)
        End Try
    End Sub

    Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
        MyBase.OnLoad(e)
        InitGrid()
        KanBewaren = False
        KanVerwijderen = False
    End Sub

#End Region

#Region "Events"

    Protected Overrides Sub OnKeyUp(ByVal e As KeyEventArgs)
        MyBase.OnKeyUp(e)
        Select Case e.KeyCode
            Case Keys.F2
                Me.BewaarHuidigeLeveringsbon()
            Case Keys.F3
                If (KanVerwijderen) Then
                    Me.VerwijderHuidigeVerkoopsDetailRij()
                End If
            Case Keys.F4
                ' TODO nieuw
            Case Keys.F6
                If (KanWijzigen AndAlso Grid1.SelectedRows.Count > 0) Then
                    WijzigLeveringsbonDetailGegevens(Grid1.SelectedRows(0).Index)
                End If
            Case Keys.F8
                Me.PrintHuidigeLeveringsbon()
            Case Keys.F12
                Me.Close()
        End Select
    End Sub

    Private Sub tsbNieuw_Click(ByVal sender As Object, ByVal e As EventArgs) Handles tsbNieuw.Click
        ' TODO
    End Sub

    Private Sub tsbBewaren_Click(ByVal sender As Object, ByVal e As EventArgs) Handles tsbBewaren.Click
        Me.BewaarHuidigeLeveringsbon()
    End Sub

    Private Sub tsbSluiten_Click(ByVal sender As Object, ByVal e As EventArgs) Handles tsbSluiten.Click
        Me.Close()
    End Sub

    Private Sub ButtonKlant_Click(ByVal sender As Object, ByVal e As EventArgs) Handles ButtonKlant.Click
        Me.ToonBeheerKlant()
    End Sub

    Private Sub tsbVerwijderen_Click(ByVal sender As Object, ByVal e As EventArgs) Handles tsbVerwijderen.Click
        Me.VerwijderHuidigeVerkoopsDetailRij()
    End Sub

    Private Sub tsbWijzigen_Click(ByVal sender As Object, ByVal e As EventArgs) Handles tsbWijzigen.Click
        If (Grid1.SelectedRows.Count > 0) Then
            WijzigLeveringsbonDetailGegevens(Grid1.SelectedRows(0).Index)
        End If
    End Sub

    Private Sub tsbAfdrukken_Click(ByVal sender As Object, ByVal e As EventArgs) Handles tsbAfdrukken.Click
        Me.PrintHuidigeLeveringsbon()
    End Sub

    Private Sub cbBehandeld_Click(ByVal sender As Object, ByVal e As EventArgs) Handles cbBehandeld.Click
        KanBewaren = True
    End Sub

    Private Sub cbConsignatie_Click(ByVal sender As Object, ByVal e As EventArgs) Handles cbConsignatie.Click
        KanBewaren = True
    End Sub

    Private Sub Grid1_RowsRemoved(ByVal sender As Object, ByVal e As DataGridViewRowsRemovedEventArgs) Handles Grid1.RowsRemoved
        UpdateTotaal()
        KanBewaren = True
    End Sub

    Private Sub Grid1_SelectionChanged(ByVal sender As Object, ByVal e As EventArgs) _
            Handles Grid1.SelectionChanged
        KanVerwijderen = (Grid1.SelectedRows.Count > 0 AndAlso Not IsFactuurBehandeld)
        KanWijzigen = (Grid1.SelectedRows.Count > 0 AndAlso Not IsFactuurBehandeld)
    End Sub

    Private Sub Grid1_CellDoubleClick(ByVal sender As Object, ByVal e As Windows.Forms.DataGridViewCellEventArgs) _
            Handles Grid1.CellDoubleClick
        WijzigLeveringsbonDetailGegevens(e.RowIndex)
    End Sub

    Private Sub Grid1_DataError(ByVal sender As Object, ByVal e As DataGridViewDataErrorEventArgs) _
            Handles Grid1.DataError
        MsgBox.ShowError("Ongeldige invoer. Bij een wijziging, druk Esc om de vorige waarde te herstellen")
        log.WriteError("LeveringsbonDetailsForm.Grid1_DataError", e.Exception)
        e.Cancel = True
    End Sub

    Private Sub VerkopenBindingSource_BindingComplete(ByVal sender As Object, ByVal e As BindingCompleteEventArgs) Handles VerkopenBindingSource.BindingComplete
        'KanBewaren = ArtikelsDataSet1.HasChanges() ' werkt niet
        If (Utility.HasDataChanged(e, VerkopenBindingSource.DataMember)) Then
            KanBewaren = True
        End If
    End Sub

    Protected Overrides Sub OnFormClosing(ByVal e As FormClosingEventArgs)
        MyBase.OnFormClosing(e)
        'If (Not Me.Validate()) Then
        '    e.Cancel = True
        '    Return
        'End If
        Me.VerkopenBindingSource.EndEdit()
        If (Not _myLeveringsbonRow.RowState = DataRowState.Unchanged OrElse _
                Utility.HasChanges(Utility.Data.VerkoopsDetails)) Then
            Dim result As DialogResult = MessageBox.Show("Deze leveringsbon bevat wijzigingen. Wil je de wijzigingen bewaren?", "Bewaren", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Exclamation)
            Select Case result
                Case DialogResult.Yes
                    If (Not BewaarHuidigeLeveringsbon()) Then
                        e.Cancel = True
                        Return
                    End If
                Case DialogResult.Cancel
                    e.Cancel = True
                    Return
                Case DialogResult.No
                    ' annuleer de wijzigingen en laat sluiten
                    'Me.VerkopenBindingSource.CancelEdit()
                    'Me.VerkoopsDetailsBindingSource.CancelEdit() ' werkt niet, VerkoopsDetails blijven nog altijd gewijzigd
                    Utility.Data.VerkoopsDetails.RejectChanges()
                    _myLeveringsbonRow.RejectChanges()
            End Select
        End If
        ' We have to dispose of the grid before the form closes to avoid possible DataErrors from the GridViewComboBoxColumn
        Me.Grid1.Dispose()
    End Sub

#End Region

#Region "Helpers"

    Private Sub InitGrid()
        With DataGridViewHelper.GetGridColumnByDataName(Utility.Data.VerkoopsDetails.IdColumn.ColumnName, Grid1)
            .Visible = False
        End With
        With DataGridViewHelper.GetGridColumnByDataName(Utility.Data.VerkoopsDetails.OmschrijvingColumn.ColumnName, Grid1)
            .Width = 250
            .SortMode = DataGridViewColumnSortMode.NotSortable
        End With
        With DataGridViewHelper.GetGridColumnByDataName(Utility.Data.VerkoopsDetails.PrijsColumn.ColumnName, Grid1)
            .Width = 80
            .DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
            .DefaultCellStyle.Format = "c"
            .SortMode = DataGridViewColumnSortMode.NotSortable
        End With
        With DataGridViewHelper.GetGridColumnByDataName(Utility.Data.VerkoopsDetails.AantalColumn.ColumnName, Grid1)
            .Width = 80
            .HeaderText = "Aantal"
            .DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
            .SortMode = DataGridViewColumnSortMode.NotSortable
        End With
        With DataGridViewHelper.GetGridColumnByDataName(Utility.Data.VerkoopsDetails.BTWColumn.ColumnName, Grid1)
            .Width = 60
            .HeaderText = "BTW"
            .DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
            .SortMode = DataGridViewColumnSortMode.NotSortable
        End With
        With DataGridViewHelper.GetGridColumnByDataName(Utility.Data.VerkoopsDetails.TotaalColumn.ColumnName, Grid1)
            .Width = 120
            .DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
            .DefaultCellStyle.Format = "c"
            .SortMode = DataGridViewColumnSortMode.NotSortable
        End With
        With DataGridViewHelper.GetGridColumnByDataName(Utility.Data.VerkoopsDetails.TotaalStatiegeldColumn.ColumnName, Grid1)
            .Width = 80
            .HeaderText = "Statiegeld"
            .DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
            .DefaultCellStyle.Format = "c"
            .SortMode = DataGridViewColumnSortMode.NotSortable
        End With
    End Sub

    Private Sub ToonBeheerKlant()
        Try
            Cursor = Cursors.WaitCursor
            Dim klantForm As New BeheerKlantForm(_myLeveringsbonRow.IdKlant)
            Dim result As DialogResult = klantForm.ShowDialog()
        Catch ex As Exception
            MsgBox.ShowError(ex.Message & Environment.NewLine & "Fout tijdens klantbeheer")
            log.WriteError("LeveringsbonDetailsForm.ToonBeheerKlant", ex)
        Finally
            Cursor = Cursors.Default
        End Try
    End Sub

    Private Sub WijzigLeveringsbonDetailGegevens(ByVal rowIndex As Integer)
        If (Not IsFactuurBehandeld) Then
            Try
                Cursor = Cursors.WaitCursor
                Dim verkoopsDetailsRow As ArtikelsDataSet.VerkoopsDetailsRow = Utility.GetGridDataRow(Of ArtikelsDataSet.VerkoopsDetailsRow)(Grid1, rowIndex)
                If (verkoopsDetailsRow Is Nothing) Then Return ' bijvoorbeeld bij dubbelklikken op lege rij onderaan

                Dim editForm As New AantalWijzigenForm(verkoopsDetailsRow.Aantal, True)
                If (editForm.ShowDialog = Windows.Forms.DialogResult.OK) Then
                    ' hier is alleen de mogelijkheid het aantal in te stellen
                    verkoopsDetailsRow.PasAantalAan(editForm.Aantal)
                    UpdateTotaal()
                    KanBewaren = True
                End If
            Catch ex As Exception
                log.WriteError("LeveringsbonDetailsForm.BeheerArtikel", ex)
            Finally
                Cursor = Cursors.Default
            End Try
        Else
            MsgBox.ShowError("Deze leveringsbon is reeds gefactureerd en kan niet meer gewijzigd worden. Als je hem wil ongedaan maken, voer dan een tegengestelde leveringsbon in.")
        End If
    End Sub

    Private Function BewaarHuidigeLeveringsbon() As Boolean
        If (Not Me.Validate()) Then Return False
        Try
            ' Datum niet aanpassen?
            Me.VerkopenBindingSource.EndEdit()
            Me.KlantenBindingSource.EndEdit()
            Dim verkopenTableAdapter As New ArtikelsDataSetTableAdapters.VerkopenTableAdapter()
            verkopenTableAdapter.Update(Utility.Data.Verkopen)
            Dim klantenTableAdapter As New ArtikelsDataSetTableAdapters.KlantenTableAdapter()
            klantenTableAdapter.Update(Utility.Data.Klanten)
            Dal.VerkoopsDetailsBewaren(_myLeveringsbonRow.GetVerkoopsDetailsRows()) ' dit past ook de stock aan
            KanBewaren = False
            Return True
        Catch ex As Exception
            MsgBox.ShowError(ex.ToString + "Fout tijdens bewaren")
            log.WriteError("LeveringsbonDetailsForm.BewaarHuidigeLeveringsbon", ex)
            Return False
        End Try
    End Function

    Private Sub PrintHuidigeLeveringsbon()
        PrintUtility.PrintLeveringsbon(_myLeveringsbonRow.Id, 1, False)
    End Sub

    Private Sub VerwijderHuidigeVerkoopsDetailRij()
        Try
            For i As Integer = Grid1.SelectedRows.Count - 1 To 0
                Grid1.Rows.Remove(Grid1.SelectedRows(i))
            Next
        Catch ex As Exception
            MsgBox.ShowError(ex.ToString + "Fout tijdens verwijderen leveringsbon-detail")
            log.WriteError("LeveringsbonDetailsForm.VerwijderHuidigeVerkoopRij", ex)
        End Try
    End Sub

    Private Sub UpdateTotaal()
        Dim totaal As Decimal = (From vd In _myLeveringsbonRow.GetVerkoopsDetailsRows Select vd _
                                Where vd.RowState <> DataRowState.Deleted _
                                Select (vd.Totaal + vd.TotaalStatiegeld)) _
                                .Sum()
        Me.lblTotaal.Text = totaal.ToString("c")
    End Sub

#End Region

End Class